import MyReaml.realmTest;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import sun.security.provider.MD5;

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
//        SecurityManager securityManager=new DefaultSecurityManager();
//
//
//        new IniRealm("classpath:aa.ini");
        //通过md5获取对应字符串的加密方式
        Md5Hash md5Hash = new Md5Hash("123","ewq",1024);
        System.out.println(md5Hash.toHex());

//        创建一个realm,这里我们用自定义的realm,这样可以使用数据
        realmTest realmTest = new realmTest();

//        创建一个hash的密码适配器,用于在成功校验用户名后进行密码的校验
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();

//        密码适配器采用的算法
        hashedCredentialsMatcher.setHashAlgorithmName("md5");

//        md5hash的散列次数
        hashedCredentialsMatcher.setHashIterations(1024);

//        为realm设置密码适配器
        realmTest.setCredentialsMatcher(hashedCredentialsMatcher);

//        创建一个默认的SecurityMananger，且表明使用我们自定义的realm
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(realmTest);

//        设置我们采用的manager
        SecurityUtils.setSecurityManager(defaultSecurityManager);

//        获取用户主体
        Subject subject = SecurityUtils.getSubject();

//        设置令牌
        UsernamePasswordToken token = new UsernamePasswordToken("lisi","123");



        try{

            subject.login(token);  //如果没有登录成功就会抛出错误，这个log依赖于自定义realm中的doGetAuthenticationInfo方法
            System.out.println("成功登录");
            System.out.println(subject.isAuthenticated());
        }catch (IncorrectCredentialsException e){
            System.out.println("密码错误");
            System.out.println(e);
        }catch (UnknownAccountException e){
            System.out.println("用户名不合法");
            System.out.println(e);
        }

        /**
         * 以下是对shuro授权的一些操作
         *
         */

        if(subject.isAuthenticated()){  //如果该用户可以进行同行

//          1.  查看该用户是否有相应的用户权限
            boolean admin = subject.hasRole("admin");   //true
//            subject.hasAllRoles();   //传入一个集合
//            subject.hasRoles();   //传入一个集合


//            2. 查看该用户是否有相应的资源权限
            boolean permitted = subject.isPermitted("Student:*:student1");  //true

//            subject.isPermittedAll()



        }






    }
}
